有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

elasticsearch使用JAVA API从Elastic Search建议搜索响应中提取源数据

我在Java中使用CompletionSuggester来自动完成应用程序,我能够使用JavaAPI从搜索响应中提取建议文本。在检查原始响应时,我看到建议响应包含源数据(完整文档,而不仅仅是建议字符串)。如何从建议搜索响应中提取源数据

请在下面找到我用来获取建议文本的代码-

SearchRequest searchRequest = new SearchRequest("my_entitiy");
CompletionSuggestionBuilder suggestionBuilder = new CompletionSuggestionBuilder("nameSuggest");
suggestionBuilder.size(10).prefix(input).skipDuplicates(true);

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.suggest(
        new SuggestBuilder().addSuggestion(SUGGESTION_NAME, suggestionBuilder));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = elasticClient.search(searchRequest, RequestOptions.DEFAULT);

Suggest suggest = searchResponse.getSuggest();
Suggest.Suggestion<Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option>> suggesition =
        suggest.getSuggestion(SUGGESTION_NAME);
List<String> suggestionList =  new ArrayList<>();
for (Suggest.Suggestion.Entry<Suggest.Suggestion.Entry.Option> entry : suggesition.getEntries()) {
  for(Suggest.Suggestion.Entry.Option option:entry.getOptions()){
    suggestionList.add(option.getText().toString());
  }
}

在选项中,有几种方法可用于提取分数、文本和突出显示的内容。是否可以从选项中获取_源数据?我看到一个toXContent函数,可以使用它来获取源数据吗

上面的代码片段正在将建议的字符串保存到一个列表中,我想知道是否有可能获得完整的docjson


共 (3) 个答案

  1. # 1 楼答案

    我通过将Suggest.Suggestion.Entry.Option转换为它的实现CompletionSuggestion.Entry.Option实现了这个技巧,它公开了SearchHit。下面是将源映射到对象的步骤

    CompletionSuggestion.Entry.Option completionSuggestionEntryOption =
                  (CompletionSuggestion.Entry.Option) option;
              SearchHit searchHit = completionSuggestionEntryOption.getHit();
              String hitJson = searchHit.getSourceAsString();
              ObjectMapper objectMapper = new ObjectMapper();
              T object = objectMapper.readValue(hitJson, clazz);
    

    clazz是要映射到的类

  2. # 2 楼答案

    您可以使用JHLC(java高级rest客户端)的fetch source API,它是Elasticsearch的官方java客户端

    根据链接

    This API helps to get only the _source field of a document.

    您可以从之前的响应中获取id,然后使用获取这些文档的来源

    GetSourceRequest getSourceRequest = new GetSourceRequest(
        "posts", 
        "1"); 
    

    在Elastic and的样本上方,其中posts是索引名,1是文档id

  3. # 3 楼答案

    您始终可以使用源筛选来筛选搜索结果中要返回的字段。在elastic中,可以在_source上下文中添加includesexcludes或两者。例如,您只想获取field1field2,您可以将_source与查询一起设置如下:

    {
      "query":{
        // your query goes here
      },
      "_source":{
        "includes":["field1", "field2"]
      }
    }
    

    使用高级rest客户端,可以实现以下相同功能:

    String[] includes = {"field1", "field2"};
    searchSourceBuilder.fetchSource(new FetchSourceContext(true, includes, null));